現在多數的 Discord Bot 的概念,都是一個 Bot 對應到多個 Guild,就跟一般人在 Discord 時一樣,一個人加入多個伺服器。如果在這種模型下,每個模組必須獨立進行信息的分類,導致程式碼的重複性及複雜性都會增加。
// Module A
client.on("messageCreate", (message) => {
// 這裡,我們不知道 message 是從哪個伺服器(或 DM 頻道)發出的
});
// Module B
client.on("messageCreate", (message) => {
// 這裡,我們不知道 message 是從哪個伺服器(或 DM 頻道)發出的
});
甚至,如果有多個模組對於相同事件回應的話,就會造成衝突(interaction 只能 reply
一次)。
但是,在實務上從 Bot 的角度來看,每個 Guild 對應到的 Bot 都不太相同,針對不同的 Guild 會有不同的設定,例如說權限、指令、是不是付費伺服器等等,這部分的成本如果轉移到框架的範圍,就可以讓開發者專注在模組本身的邏輯上。再者,事實上 1-n 的概念在大型 Discord Bot 中是行不通的,因為當加入的伺服器過多時,Discord 會要求進行 Sharding,也就是將一個 Bot 分割成多個 Bot,每個 Bot 只負責一部分的伺服器,既然如此,何不一開始就用 1-1 的模型呢?
我們可以針對不同的 Guild 建立獨立的 Pipeline 來處理事件。
Express 或 Koa 這類的網頁伺服器框架,都有一個 .use()
來使用 middleware,我們或許也可以這麼做。
const bot = new Bot(TOKEN);
bot.use(new Module({
// 模組的設定
}));
bot.start();
我們的模組也許會長這樣:
class Module {
intents = [
GatewayIntentBits.MessageContent,
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
];
async message({ msg, guild, reply }): Promise<boolean> {
if (!guild) {
return false;
}
if (msg.content === "ping") {
await reply("pong");
return true;
}
}
}
總而言之,我們可以建立一個與 Koa 類似的洋蔥模型來處理事件,為了使:
以 2022/09/18 20:00 ~ 2022/09/19 20:00 文章觀看數增加值排名
誤差: 1 小時
+3770
D01 - 沒時間解釋了,快上車!
+774
D05 - 飄吧!多邊形!
+734
D03 - 建立專案
+349
「全端挑戰」學習Mern全端開發概念與動態網站開發流程懶人包
+342
了解Scss與React Component與首頁概念圖與UI實作
+309
架設環境、了解npm指令、React與React Dom與創建第一個ReactApp
+271
Scss與React Component的動態實作Navbar與Header
+189
Day01 - 為什麼要裝 Node.js?
+146
第 15 話 面對年齡的思考與能力上要評估的思維
+127
終究都要學 React 何不現在學呢? - React 基礎 - React 是什麼? - (1)
是不是有人偷刷瀏覽次數?可惡,我也好想刷!